본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

동시 멀티스레딩(Simultaneous Multithreading, SMT)은 하나의 물리 코어가 여러 스레드의 명령어를 같은 클록 사이클에 함께 발행해, 한 스레드만으로는 다 쓰지 못하는 실행 유닛을 채우는 하드웨어 멀티스레딩 기법이다. 인텔은 이를 하이퍼스레딩(Hyper-Threading Technology)이라는 이름으로 2002년부터 제품에 넣었다.

슈퍼스칼라 코어는 한 사이클에 여러 명령어를 동시에 실행할 수 있도록 정수·부동소수점·적재/저장 유닛을 여러 개 갖고 있다. 그런데 한 스레드의 명령어만으로는 의존성, 분기 예측 실패, 캐시 미스 때문에 이 유닛들이 자주 비어 있게 된다. 한 사이클 안에서 일부 슬롯만 쓰는 것을 수평 낭비, 메모리를 기다리느라 사이클 전체가 비는 것을 수직 낭비라 한다.

동시 멀티스레딩은 코어 하나에 스레드 문맥을 둘 이상 올려 두고, 매 사이클 여러 스레드에서 준비된 명령어를 골라 빈 슬롯을 채운다. 운영체제에는 물리 코어 하나가 논리 프로세서 둘(또는 그 이상)로 보인다.

구분 스레드마다 따로 둔다 스레드끼리 나눠 쓴다
자원 프로그램 카운터, 아키텍처 레지스터(레지스터 이름표), 일부 큐의 몫 실행 유닛, L1·L2 캐시, TLB, 분기 예측기, 재정렬 버퍼 등 대부분
  • 늘어나는 것은 스레드 상태를 담는 부분뿐이라 코어 면적 증가가 작다. 인텔은 펜티엄 4 의 하이퍼스레딩이 다이 면적을 5% 미만 늘렸다고 밝혔다.
  • 한 스레드가 캐시 미스로 멈춰 있는 동안 다른 스레드의 명령어가 실행 유닛을 쓴다. 그래서 메모리 지연을 숨기는 효과가 있다.

하드웨어 멀티스레딩의 종류

편집 원본 편집
방식 스레드 전환 시점 한 사이클에 명령을 내는 스레드 수
세밀한 멀티스레딩(Fine-grained) 매 사이클 번갈아 하나
성긴 멀티스레딩(Coarse-grained) 긴 지연(캐시 미스 등)이 생길 때 하나
동시 멀티스레딩(SMT) 전환하지 않고 섞어서 여럿
  • 코어 수를 늘리지 않고 처리량(throughput)을 높인다. 웹 서버·데이터베이스처럼 독립된 요청이 많고 메모리 대기가 잦은 작업에서 효과가 크다.
  • 향상 폭은 작업에 따라 다르며 대체로 수십 퍼센트 이내다. 물리 코어를 하나 더 둔 것만큼 빨라지지는 않는다.
  • 실행 유닛의 이용률이 올라 같은 전력으로 더 많은 일을 할 수 있다.
  • 자원 경합 — 두 스레드가 같은 실행 유닛, 캐시, TLB, 메모리 대역폭을 나눠 쓴다. 둘 다 같은 유닛을 많이 쓰는 작업(예: 부동소수점 연산이 꽉 찬 과학 계산)이면 얻는 것이 거의 없고, 오히려 느려질 수 있다.
  • 캐시 오염 — 한 스레드가 다른 스레드의 캐시 내용을 밀어낸다. 작업 집합이 큰 프로그램끼리 묶이면 캐시 미스가 늘어난다.
  • 단일 스레드 성능 저하 — 한 스레드가 코어를 혼자 쓸 때보다 느려진다. 응답 시간이 중요한 작업이나 실시간 시스템에서는 실행 시간의 예측성이 떨어진다.
  • 보안 — 같은 코어의 자원을 공유하므로 한 스레드가 다른 스레드의 실행 흔적을 캐시·실행 포트 경합으로 엿보는 부채널 공격의 통로가 된다. 2018년 PortSmash(실행 포트 경합), L1TF(Foreshadow) 등이 발표된 뒤 일부 운영체제·클라우드 사업자는 SMT 를 끄거나 서로 다른 고객의 작업을 한 코어에 올리지 않도록 스케줄링한다. 관련 문서: 스펙터, 멜트다운
  • 소프트웨어의 인식 필요 — 운영체제 스케줄러가 논리 프로세서와 물리 코어를 구분하지 못하면, 한 코어에 일을 몰고 다른 코어를 놀리는 잘못된 배치를 한다. 코어 수 기준 소프트웨어 라이선스 산정도 따로 따져야 한다.
  • 병렬화로 얻을 수 있는 향상은 결국 순차 구간이 제한한다 → 암달의 법칙